#ifndef __LIBALGORITHM_H
#define __LIBALGORITHM_H

#include <iostream>
#include <vector>
#include <unordered_map>


struct pair_hash 
{
    template <class T1, class T2>
    std::size_t operator()(const std::pair<T1, T2>& pair) const 
    {
        return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
    }
};

struct BusLine 
{
    std::string lineName;   
    std::vector<std::string> stations;  
    std::unordered_map<std::pair<std::string, std::string>, int, pair_hash> travelTimes; 
    std::string firstBusTime; 
    std::string lastBusTime; 
};


class BusSystem 
{
public:
    static std::unordered_map<std::string, std::vector<BusLine>> routes;

    static void printRoutes();

    class algorithm
    {
    public:
        // 查询公交线路详情
        static std::string queryBusLineDetails(const std::string& lineName);

        // 查询两站之间的路线
        static std::string queryRoutesBetweenStops(const std::string& start, const std::string& end);

        // 查询所有路线
        static std::string findAllPossibleRoutes(const std::string& start, const std::string& end);

        // 深度优化算法
        static void dfs(const std::string& current, const std::string& end, 
         std::unordered_map<std::string, bool>& visited, std::vector<std::string>& path, 
                            std::stringstream& ss);

        // 查找并显示所有直达路线（仅考虑旅行时间为正的路线）
        static std::string findDirectRoutes(const std::string& start, const std::string& end);

        // 最优换乘算法（BFS）：找到最少站数或最少换乘次数的路径
        static std::string findOptimalRoute(const std::string& start, const std::string& end);

        // Dijkstra 算法：找到用时最少的路径
        static std::string findShortestTimeRoute(const std::string& start, const std::string& end);
    }algrithm;

    class update
    {
    public:
        // 加载预设路线
        static void addTestRoutes(std::vector<BusLine>& busLines);

        // 更新路线
        static void addOrUpdateLine();
    }update;
    

    class io
    {
    public:
        // 将线路保存到文件
        static void saveRoutesToFile();

        // 从文件加载路线
        static void loadRoutesFromFile();
    }io;


    class user
    {
    public:
        // 管理员菜单
        static bool adminMenu();

        // 用户菜单
        static bool userMenu();

        // 起始登录页
        static void login();
    }user;
};

#endif // __LIBALGORITHM_H
